package com.cneport.das.common.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * @author GavinZhang
 * @version 1.0
 * @desc： 自定义随机码的生成工具
 * @company 东方物通科技有限（北京）公司
 * @date 2021/8/6 8:07
 */
public class RandomGenerator {

    public static List<String> source = new ArrayList<>();

    public static void init(List<String> customer) {
        if (customer != null && customer.size() > 0) {
            source = customer;
        } else {

            //添加0-9
            for (int i = 0; i < 10; i++) {
                source.add(i + "");
            }
            //添加A-Z(65-90)
            for (int i = 65; i < 91; i++) {
                source.add(ascii2Char(i) + "");
            }
            for (int i = 97; i < 123; i++) {
                source.add(ascii2Char(i) + "");
            }
        }
    }

    /**
     * 字符（串）转Ascii对于的数字
     *
     * @param str
     * @return
     */
    public static int str2Ascii(String str) {
        byte[] bytestr = str.getBytes();
        int sum = 0;
        for (int i = 0; i < bytestr.length; i++) {
            sum += bytestr[i];
        }
        return sum;
    }

    /**
     * Ascii(十进制数字表示的)转字符(只需要大小写字母和数字)
     *
     * @param ascii 用数字表示的ascii
     * @return
     */
    public static char ascii2Char(int ascii) {
        if (ascii >= 65 && ascii <= 90) {
            return (char) ascii;
        } else if (ascii >= 97 && ascii <= 122) {
            return (char) ascii;
        } else {
            return ' ';
        }

    }

    /**
     * 取指定长度的随机数（无法绝对保证不重复）
     *
     * @param customer 客户指定的字符范围
     * @param length   随机数长度
     * @return
     */
    public static synchronized String genRandomNum(List<String> customer, int length) {
        init(customer);
        StringBuilder sb = new StringBuilder();
        Random rand = new Random();
        int size = source.size();
        int index = rand.nextInt(size);
        if (size == 0) {
            return "";
        } else {
            for (int n = 0; n < length; n++) {
                for (int k = 0; k < 36; k++) {
                    //空取7次，打乱有序的总趋势
                    index = rand.nextInt(size);
                }
                sb.append(source.get(index));
            }
            return sb.toString();
        }
    }

    /**
     * 取指定长度的随机数（无法绝对保证不重复）,随机数中包含数字，字母大小写。
     *
     * @param length 随机数长度
     * @return
     */
    public static synchronized String genRandomNum(int length) {
        return genRandomNum(null, length);
    }

    /**
     * 获得32位长的序列号（英文字母大写+数字）
     *
     * @return
     */
    public static String genGuid() {
        return cn.hutool.core.util.IdUtil.simpleUUID().toUpperCase();
    }

    /**
     * 获得36位长的序列号
     *
     * @return
     */
    public static String genId() {
        return cn.hutool.core.util.IdUtil.randomUUID();
    }

    /**
     * 获取指定长度的纯数字的随机串
     *
     * @param length
     * @return
     */
    public static synchronized String getNumSequence(int length) {
        List<String> source = Arrays.asList(new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"});
        return genRandomNum(source, length);
    }
}
